Libraries

library(dplyr)
library(ggplot2)
library(targets)

Helper Functions

source("R/functions_analysis.R")

Data

tar_load(metric_table_master)

Analysis

Reference Dataset

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM", "tradeSeq")) %>% 
  ggplot(aes(x = ROC_AUC, y = SIM_REFERENCE, color = MODEL_TYPE, fill = MODEL_TYPE)) + 
  facet_wrap(~MODEL_TYPE) + 
  ggridges::geom_density_ridges(alpha = 0.6, scale = 0.95, linewidth = 1) + 
  scale_x_continuous(labels = scales::label_percent()) + 
  labs(y = "Reference Dataset", x = "ROC-AUC") + 
  theme_analysis() + 
  theme(legend.position = "none")

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM", "tradeSeq")) %>% 
  ggplot(aes(x = F_MEASURE, y = SIM_REFERENCE, color = MODEL_TYPE, fill = MODEL_TYPE)) + 
  facet_wrap(~MODEL_TYPE) + 
  ggridges::geom_density_ridges(alpha = 0.6, scale = 0.95, linewidth = 1) + 
  scale_x_continuous(labels = scales::label_number(accuracy = 0.1), 
                     limits = c(NA, 1)) + 
  labs(y = "Reference Dataset", x = "F-measure") + 
  theme_analysis() + 
  theme(legend.position = "none")

Runtime

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM", "tradeSeq")) %>% 
  mutate(N_CELLS = round(N_CELLS, digits = -1), 
         N_CELLS = as.factor(N_CELLS), 
         RUNTIME_MINS = RUNTIME_HOURS * 60) %>% 
  ggplot(aes(x = N_CELLS, y = RUNTIME_MINS, color = MODEL_TYPE)) + 
  geom_boxplot() + 
  scale_y_continuous(labels = scales::label_number(accuracy = 1, suffix = "min")) + 
  labs(x = "Cells", y = "Runtime") + 
  theme_analysis() + 
  theme(legend.title = element_blank())

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM", "tradeSeq")) %>% 
  mutate(RUNTIME_MINS = RUNTIME_HOURS * 60, 
         GENES_PER_MIN = N_GENES / RUNTIME_MINS) %>% 
  ggplot(aes(x = N_CELLS, y = GENES_PER_MIN, color = MODEL_TYPE, fill = MODEL_TYPE)) + 
  geom_smooth(method = "lm", alpha = 0.25) + 
  scale_y_continuous(labels = scales::label_number(accuracy = 1)) + 
  labs(x = "Cells", y = "Genes per Minute") + 
  theme_analysis() + 
  theme(legend.title = element_blank()) + 
  guides(color = guide_legend(override.aes = list(alpha = 0, linewidth = 2)))

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM", "tradeSeq")) %>% 
  mutate(RUNTIME_MINS = RUNTIME_HOURS * 60, 
         GENES_PER_MIN = N_GENES / RUNTIME_MINS) %>% 
  ggplot(aes(x = GENES_PER_MIN, color = MODEL_TYPE, fill = MODEL_TYPE)) + 
  geom_density(alpha = 0.3, linewidth = 1) + 
  scale_x_continuous(labels = scales::label_number(accuracy = 1)) + 
  labs(x = "Genes per Minute", y = "Density") + 
  theme_analysis() + 
  theme(legend.title = element_blank()) + 
  guides(color = guide_legend(override.aes = list(alpha = 1, color = "white", linewidth = 0.5)))

Memory Usage

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM", "tradeSeq")) %>% 
  mutate(N_CELLS = round(N_CELLS, digits = -1), 
         N_CELLS = as.factor(N_CELLS), 
         MEM_USED_GB = MEM_USED / 1000) %>% 
  ggplot(aes(x = N_CELLS, y = MEM_USED_GB, color = MODEL_TYPE)) + 
  geom_boxplot() + 
  scale_y_continuous(labels = scales::label_number(suffix = "gb")) + 
  labs(x = "Cells", y = "Memory Usage") + 
  theme_analysis() + 
  theme(legend.title = element_blank())

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM", "tradeSeq")) %>% 
  mutate(MEM_USED_GB = MEM_USED / 1000) %>% 
  ggplot(aes(x = MEM_USED_GB, color = MODEL_TYPE, fill = MODEL_TYPE)) + 
  geom_density(alpha = 0.3, linewidth = 1) + 
  scale_x_continuous(labels = scales::label_number(suffix = "gb")) + 
  labs(x = "Memory Usage", y = "Density") + 
  theme_analysis() + 
  theme(legend.title = element_blank()) + 
  guides(color = guide_legend(override.aes = list(alpha = 1, color = "white", linewidth = 0.5)))

Predictive Performance

F-measure

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM", "tradeSeq")) %>% 
  mutate(N_CELLS = round(N_CELLS, digits = -1), 
         N_CELLS = as.factor(N_CELLS)) %>% 
  ggplot(aes(x = N_CELLS, y = F_MEASURE, color = MODEL_TYPE)) + 
  geom_boxplot() + 
  scale_y_continuous(labels = scales::label_number(accuracy = 0.1)) + 
  labs(x = "Cells", y = "F-measure") + 
  theme_analysis() + 
  theme(legend.title = element_blank())

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM", "tradeSeq")) %>% 
  ggplot(aes(x = F_MEASURE, color = MODEL_TYPE, fill = MODEL_TYPE)) + 
  geom_density(alpha = 0.3, linewidth = 1) + 
  scale_x_continuous(labels = scales::label_number(accuracy = 0.1)) + 
  labs(x = "F-measure", y = "Density") + 
  theme_analysis() + 
  theme(legend.title = element_blank()) + 
  guides(color = guide_legend(override.aes = list(alpha = 1, color = "white", linewidth = 0.5)))

Balanced Accuracy

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM", "tradeSeq")) %>% 
  mutate(N_CELLS = round(N_CELLS, digits = -1), 
         N_CELLS = as.factor(N_CELLS)) %>% 
  ggplot(aes(x = N_CELLS, y = BAL_ACCURACY, color = MODEL_TYPE)) + 
  geom_boxplot() + 
  scale_y_continuous(labels = scales::label_percent(accuracy = 1)) + 
  labs(x = "Cells", y = "Balanced Accuracy") + 
  theme_analysis() + 
  theme(legend.title = element_blank())

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM", "tradeSeq")) %>% 
  ggplot(aes(x = BAL_ACCURACY, color = MODEL_TYPE, fill = MODEL_TYPE)) + 
  geom_density(alpha = 0.3, linewidth = 1) + 
  scale_x_continuous(labels = scales::label_percent(accuracy = 1)) + 
  labs(x = "Balanced Accuracy", y = "Density") + 
  theme_analysis() + 
  theme(legend.title = element_blank()) + 
  guides(color = guide_legend(override.aes = list(alpha = 1, color = "white", linewidth = 0.5)))

Recall

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM", "tradeSeq")) %>% 
  mutate(N_CELLS = round(N_CELLS, digits = -1), 
         N_CELLS = as.factor(N_CELLS)) %>% 
  ggplot(aes(x = N_CELLS, y = RECALL, color = MODEL_TYPE)) + 
  geom_boxplot() + 
  scale_y_continuous(labels = scales::label_percent(accuracy = 1)) + 
  labs(x = "Cells", y = "Recall") + 
  theme_analysis() + 
  theme(legend.title = element_blank())

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM", "tradeSeq")) %>% 
  ggplot(aes(x = RECALL, color = MODEL_TYPE, fill = MODEL_TYPE)) + 
  geom_density(alpha = 0.3, linewidth = 1) + 
  scale_x_continuous(labels = scales::label_percent(accuracy = 1)) + 
  labs(x = "Recall", y = "Density") + 
  theme_analysis() + 
  theme(legend.title = element_blank()) + 
  guides(color = guide_legend(override.aes = list(alpha = 1, color = "white", linewidth = 0.5)))

Accuracy

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM", "tradeSeq")) %>% 
  mutate(N_CELLS = round(N_CELLS, digits = -1), 
         N_CELLS = as.factor(N_CELLS)) %>% 
  ggplot(aes(x = N_CELLS, y = ACCURACY)) + 
  geom_boxplot(aes(color = MODEL_TYPE)) + 
  scale_y_continuous(labels = scales::label_percent(accuracy = 1)) + 
  labs(x = "Cells", y = "Accuracy") + 
  theme_analysis() + 
  theme(legend.title = element_blank())

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM", "tradeSeq")) %>% 
  ggplot(aes(x = ACCURACY, color = MODEL_TYPE, fill = MODEL_TYPE)) + 
  geom_density(alpha = 0.3, linewidth = 1) + 
  scale_x_continuous(labels = scales::label_percent(accuracy = 1)) + 
  labs(x = "Accuracy", y = "Density") + 
  theme_analysis() + 
  theme(legend.title = element_blank()) + 
  guides(color = guide_legend(override.aes = list(alpha = 1, color = "white", linewidth = 0.5)))

ROC-AUC

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM", "tradeSeq")) %>% 
  mutate(N_CELLS = round(N_CELLS, digits = -1), 
         N_CELLS = as.factor(N_CELLS)) %>% 
  ggplot(aes(x = N_CELLS, y = ROC_AUC, color = MODEL_TYPE)) + 
  geom_boxplot() + 
  scale_y_continuous(labels = scales::label_percent(accuracy = 1)) + 
  labs(x = "Cells", y = "ROC-AUC") + 
  theme_analysis() + 
  theme(legend.title = element_blank())

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM", "tradeSeq")) %>% 
  ggplot(aes(x = ROC_AUC, color = MODEL_TYPE, fill = MODEL_TYPE)) + 
  geom_density(alpha = 0.3, linewidth = 1) + 
  scale_x_continuous(labels = scales::label_percent(accuracy = 1)) + 
  labs(x = "ROC-AUC", y = "Density") + 
  theme_analysis() + 
  theme(legend.title = element_blank()) + 
  guides(color = guide_legend(override.aes = list(alpha = 1, color = "white", linewidth = 0.5)))

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM")) %>% 
  pull(ROC_CURVE) %>% 
  purrr::reduce(rbind) %>% 
  left_join((distinct(metric_table_master, DATASET_NAME, N_CELLS)), 
            by = c("dataset" = "DATASET_NAME")) %>% 
  mutate(N_CELLS = round(N_CELLS, digits = -1), 
         N_CELLS = as.factor(N_CELLS)) %>% 
  ggplot(aes(x = 1 - specificity, y = sensitivity, group = dataset, color = N_CELLS)) + 
  facet_wrap(~paste0("Cells: ", N_CELLS)) + 
  geom_segment(x = 0, xend = 0, y = 1, yend = 1, color = "black", linetype = "dashed", size = 1) + 
  geom_line(size = 1, alpha = 0.8) + 
  scale_x_continuous(labels = scales::percent_format(accuracy = 1)) + 
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + 
  labs(x = "1 - Specificity", 
      y = "Sensitivity", 
      color = "Cells", 
      title = "scLANE - GLM") + 
  theme_analysis() +  
  guides(color = guide_legend(override.aes = list(linewidth = 2, alpha = 1)))

filter(metric_table_master, 
       MODEL_TYPE %in% c("tradeSeq")) %>% 
  pull(ROC_CURVE) %>% 
  purrr::reduce(rbind) %>% 
  left_join((distinct(metric_table_master, DATASET_NAME, N_CELLS)), 
            by = c("dataset" = "DATASET_NAME")) %>% 
  mutate(N_CELLS = round(N_CELLS, digits = -1), 
         N_CELLS = as.factor(N_CELLS)) %>% 
  ggplot(aes(x = 1 - specificity, y = sensitivity, group = dataset, color = N_CELLS)) + 
  facet_wrap(~paste0("Cells: ", N_CELLS)) + 
  geom_segment(x = 0, xend = 0, y = 1, yend = 1, color = "black", linetype = "dashed", size = 1) + 
  geom_line(size = 1, alpha = 0.8) + 
  scale_x_continuous(labels = scales::percent_format(accuracy = 1)) + 
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + 
  labs(x = "1 - Specificity", 
      y = "Sensitivity", 
      color = "Cells", 
      title = "tradeSeq") + 
  theme_analysis() + 
  guides(color = guide_legend(override.aes = list(linewidth = 2, alpha = 1)))

PR-AUC

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM", "tradeSeq")) %>% 
  mutate(N_CELLS = round(N_CELLS, digits = -1), 
         N_CELLS = as.factor(N_CELLS)) %>% 
  ggplot(aes(x = N_CELLS, y = AUC_PR, color = MODEL_TYPE)) + 
  geom_boxplot() + 
  scale_y_continuous(labels = scales::label_percent(accuracy = 1)) + 
  labs(x = "Cells", y = "PR-AUC") + 
  theme_analysis() + 
  theme(legend.title = element_blank())

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM", "tradeSeq")) %>% 
  ggplot(aes(x = AUC_PR, color = MODEL_TYPE, fill = MODEL_TYPE)) + 
  geom_density(alpha = 0.3, linewidth = 1) + 
  scale_x_continuous(labels = scales::label_percent(accuracy = 1)) + 
  labs(x = "PR-AUC", y = "Density") + 
  theme_analysis() + 
  theme(legend.title = element_blank()) + 
  guides(color = guide_legend(override.aes = list(alpha = 1, color = "white", linewidth = 0.5)))

filter(metric_table_master, 
       MODEL_TYPE %in% c("scLANE - GLM")) %>% 
  pull(PR_CURVE) %>% 
  purrr::reduce(rbind) %>% 
  left_join((distinct(metric_table_master, DATASET_NAME, N_CELLS)), 
            by = c("dataset" = "DATASET_NAME")) %>% 
  mutate(N_CELLS = round(N_CELLS, digits = -1), 
         N_CELLS = as.factor(N_CELLS)) %>% 
  ggplot(aes(x = recall, y = precision, group = dataset, color = N_CELLS)) + 
  facet_wrap(~paste0("Cells: ", N_CELLS)) + 
  geom_segment(x = 0, xend = 1, y = 1, yend = 0, color = "black", linetype = "dashed", size = 1) + 
  geom_line(size = 1, alpha = 0.8) + 
  scale_x_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_y_continuous(limits = c(0, 1), labels = scales::percent_format(accuracy = 1)) +
  labs(x = "Recall", 
       y = "Precision", 
       color = "Cells", 
       title = "scLANE - GLM") + 
  theme_analysis() + 
  guides(color = guide_legend(override.aes = list(linewidth = 2, alpha = 1)))

filter(metric_table_master, 
       MODEL_TYPE %in% c("tradeSeq")) %>% 
  pull(PR_CURVE) %>% 
  purrr::reduce(rbind) %>% 
  left_join((distinct(metric_table_master, DATASET_NAME, N_CELLS)), 
            by = c("dataset" = "DATASET_NAME")) %>% 
  mutate(N_CELLS = round(N_CELLS, digits = -1), 
         N_CELLS = as.factor(N_CELLS)) %>% 
  ggplot(aes(x = recall, y = precision, group = dataset, color = N_CELLS)) + 
  facet_wrap(~paste0("Cells: ", N_CELLS)) + 
  geom_segment(x = 0, xend = 1, y = 1, yend = 0, color = "black", linetype = "dashed", size = 1) + 
  geom_line(size = 1, alpha = 0.8) + 
  scale_x_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_y_continuous(limits = c(0, 1), labels = scales::percent_format(accuracy = 1)) +
  labs(x = "Recall", 
       y = "Precision", 
       color = "Cells", 
       title = "tradeSeq") + 
  theme_analysis() + 
  guides(color = guide_legend(override.aes = list(linewidth = 2, alpha = 1)))

Session Info

sessioninfo::session_info()
─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.3.3 (2024-02-29)
 os       Ubuntu 22.04.5 LTS
 system   x86_64, linux-gnu
 ui       X11
 language (EN)
 collate  en_US.UTF-8
 ctype    en_US.UTF-8
 tz       America/New_York
 date     2024-10-07
 pandoc   2.9.2.1 @ /usr/bin/ (via rmarkdown)

─ Packages ───────────────────────────────────────────────────────────────────
 package              * version    date (UTC) lib source
 abind                  1.4-8      2024-09-12 [2] CRAN (R 4.3.3)
 AnnotationDbi          1.62.2     2023-07-02 [2] Bioconductor
 backports              1.5.0      2024-05-23 [1] CRAN (R 4.2.3)
 base64url              1.4        2018-05-14 [1] CRAN (R 4.3.3)
 bigassertr             0.1.6      2023-01-10 [1] CRAN (R 4.3.2)
 bigparallelr           0.3.2      2021-10-02 [1] CRAN (R 4.3.2)
 bigstatsr              1.5.12     2022-10-14 [1] CRAN (R 4.3.2)
 Biobase              * 2.60.0     2023-04-25 [2] Bioconductor
 BiocGenerics         * 0.46.0     2023-04-25 [2] Bioconductor
 BiocParallel           1.34.2     2023-05-22 [2] Bioconductor
 Biostrings             2.68.1     2023-05-16 [2] Bioconductor
 bit                    4.5.0      2024-09-20 [2] CRAN (R 4.3.3)
 bit64                  4.5.2      2024-09-22 [2] CRAN (R 4.3.3)
 bitops                 1.0-8      2024-07-29 [2] CRAN (R 4.3.3)
 blob                   1.2.4      2023-03-17 [2] CRAN (R 4.3.1)
 boot                   1.3-31     2024-08-28 [4] CRAN (R 4.3.3)
 broom                * 1.0.6      2024-05-17 [1] CRAN (R 4.2.3)
 broom.mixed            0.2.9.5    2024-04-01 [1] CRAN (R 4.2.3)
 bslib                  0.8.0      2024-07-29 [2] CRAN (R 4.3.3)
 cachem                 1.1.0      2024-05-16 [2] CRAN (R 4.3.3)
 callr                  3.7.6      2024-03-25 [1] CRAN (R 4.2.3)
 caTools                1.18.3     2024-09-04 [2] CRAN (R 4.3.3)
 circlize               0.4.16     2024-02-20 [1] CRAN (R 4.3.2)
 class                  7.3-22     2023-05-03 [4] CRAN (R 4.3.1)
 cli                    3.6.2      2023-12-11 [1] CRAN (R 4.2.3)
 clue                   0.3-65     2023-09-23 [1] CRAN (R 4.3.2)
 cluster                2.1.6      2023-12-01 [4] CRAN (R 4.3.2)
 coda                   0.19-4.1   2024-01-31 [2] CRAN (R 4.3.2)
 codetools              0.2-20     2024-03-31 [4] CRAN (R 4.3.3)
 colorspace             2.1-1      2024-07-26 [2] CRAN (R 4.3.3)
 combinat               0.0-8      2012-10-29 [2] CRAN (R 4.3.1)
 ComplexHeatmap         2.16.0     2023-04-25 [1] Bioconductor
 cowplot                1.1.3      2024-01-22 [2] CRAN (R 4.3.3)
 crayon                 1.5.3      2024-06-20 [2] CRAN (R 4.3.3)
 data.table             1.16.0     2024-08-27 [2] CRAN (R 4.3.3)
 DBI                    1.2.3      2024-06-02 [2] CRAN (R 4.3.3)
 DelayedArray           0.26.7     2023-07-28 [2] Bioconductor
 devtools               2.4.5      2022-10-11 [1] CRAN (R 4.2.2)
 dials                * 1.2.1      2024-02-22 [1] CRAN (R 4.2.3)
 DiceDesign             1.10       2023-12-07 [1] CRAN (R 4.3.3)
 digest                 0.6.35     2024-03-11 [1] CRAN (R 4.2.3)
 doParallel             1.0.17     2022-02-07 [1] CRAN (R 4.2.3)
 doSNOW                 1.0.20     2022-02-04 [1] CRAN (R 4.3.2)
 dplyr                * 1.1.4      2023-11-17 [1] CRAN (R 4.2.3)
 edgeR                  3.42.4     2023-05-31 [2] Bioconductor
 ellipsis               0.3.2      2021-04-29 [2] CRAN (R 4.3.1)
 emmeans                1.10.2     2024-05-20 [1] CRAN (R 4.3.3)
 estimability           1.5.1      2024-05-12 [1] CRAN (R 4.3.3)
 evaluate               0.24.0     2024-06-10 [1] CRAN (R 4.3.3)
 fansi                  1.0.6      2023-12-08 [2] CRAN (R 4.3.1)
 farver                 2.1.2      2024-05-13 [1] CRAN (R 4.2.3)
 fastICA                1.2-4      2023-11-27 [1] CRAN (R 4.3.2)
 fastmap                1.2.0      2024-05-15 [2] CRAN (R 4.3.3)
 flock                  0.7        2016-11-12 [1] CRAN (R 4.3.2)
 forcats              * 1.0.0      2023-01-29 [1] CRAN (R 4.3.2)
 foreach                1.5.2      2022-02-02 [1] CRAN (R 4.2.3)
 fs                     1.6.4      2024-04-25 [2] CRAN (R 4.3.3)
 furrr                  0.3.1      2022-08-15 [1] CRAN (R 4.3.2)
 future               * 1.33.2     2024-03-26 [1] CRAN (R 4.2.3)
 future.apply           1.11.2     2024-03-28 [2] CRAN (R 4.3.3)
 future.callr         * 0.8.2      2023-08-09 [1] CRAN (R 4.2.3)
 gamlss                 5.4-22     2024-03-20 [1] CRAN (R 4.3.2)
 gamlss.data            6.0-6      2024-03-14 [1] CRAN (R 4.3.2)
 gamlss.dist            6.1-1      2023-08-23 [1] CRAN (R 4.3.2)
 geeM                   0.10.1     2018-06-18 [1] CRAN (R 4.3.2)
 generics               0.1.3      2022-07-05 [1] CRAN (R 4.2.0)
 GenomeInfoDb         * 1.36.4     2023-10-02 [2] Bioconductor
 GenomeInfoDbData       1.2.10     2023-07-26 [2] Bioconductor
 GenomicRanges        * 1.52.1     2023-10-08 [2] Bioconductor
 GetoptLong             1.0.5      2020-12-15 [1] CRAN (R 4.3.2)
 ggplot2              * 3.5.1      2024-04-23 [1] CRAN (R 4.2.3)
 ggridges               0.5.6      2024-01-23 [2] CRAN (R 4.3.3)
 glm2                 * 1.2.1      2018-08-11 [1] CRAN (R 4.3.2)
 glmmTMB                1.1.9      2024-03-20 [1] CRAN (R 4.3.3)
 GlobalOptions          0.1.2      2020-06-10 [1] CRAN (R 4.3.2)
 globals                0.16.3     2024-03-08 [2] CRAN (R 4.3.3)
 glue                   1.8.0      2024-09-30 [2] CRAN (R 4.3.3)
 GO.db                  3.17.0     2023-08-11 [2] Bioconductor
 gower                  1.0.1      2022-12-22 [2] CRAN (R 4.3.1)
 GPfit                  1.0-8      2019-02-08 [1] CRAN (R 4.3.3)
 gplots                 3.1.3.1    2024-02-02 [2] CRAN (R 4.3.3)
 graph                  1.78.0     2023-04-25 [1] Bioconductor
 gridExtra              2.3        2017-09-09 [2] CRAN (R 4.3.1)
 gtable                 0.3.5      2024-04-22 [2] CRAN (R 4.3.3)
 gtools                 3.9.5      2023-11-20 [2] CRAN (R 4.3.1)
 hardhat                1.4.0      2024-06-02 [1] CRAN (R 4.3.3)
 highr                  0.11       2024-05-26 [2] CRAN (R 4.3.3)
 hms                    1.1.3      2023-03-21 [2] CRAN (R 4.3.1)
 htmltools              0.5.8.1    2024-04-04 [1] CRAN (R 4.2.3)
 htmlwidgets            1.6.4      2023-12-06 [2] CRAN (R 4.3.3)
 httpuv                 1.6.15     2024-03-26 [2] CRAN (R 4.3.3)
 httr                   1.4.7      2023-08-15 [2] CRAN (R 4.3.3)
 igraph                 2.0.3      2024-03-13 [1] CRAN (R 4.2.3)
 infer                * 1.0.7      2024-03-25 [1] CRAN (R 4.2.3)
 ipred                  0.9-15     2024-07-18 [2] CRAN (R 4.3.3)
 IRanges              * 2.34.1     2023-06-22 [2] Bioconductor
 iterators              1.0.14     2022-02-05 [2] CRAN (R 4.3.1)
 jquerylib              0.1.4      2021-04-26 [2] CRAN (R 4.3.1)
 jsonlite               1.8.8      2023-12-04 [1] CRAN (R 4.2.3)
 KEGGREST               1.40.1     2023-09-29 [2] Bioconductor
 KernSmooth             2.23-24    2024-05-17 [4] CRAN (R 4.3.3)
 knitr                  1.48       2024-07-07 [2] CRAN (R 4.3.3)
 labeling               0.4.3      2023-08-29 [2] CRAN (R 4.3.1)
 Lamian               * 0.99.2     2024-03-20 [1] Github (Winnie09/Lamian@7d5a8ff)
 later                  1.3.2      2023-12-06 [2] CRAN (R 4.3.3)
 lattice                0.22-6     2024-03-20 [4] CRAN (R 4.3.3)
 lava                   1.8.0      2024-03-05 [2] CRAN (R 4.3.3)
 lhs                    1.1.6      2022-12-17 [1] CRAN (R 4.3.3)
 lifecycle              1.0.4      2023-11-07 [2] CRAN (R 4.3.1)
 limma                  3.56.2     2023-06-04 [2] Bioconductor
 listenv                0.9.1      2024-01-29 [2] CRAN (R 4.3.3)
 lme4                   1.1-35.5   2024-07-03 [2] CRAN (R 4.3.3)
 locfit                 1.5-9.10   2024-06-24 [2] CRAN (R 4.3.3)
 lubridate            * 1.9.3      2023-09-27 [2] CRAN (R 4.3.3)
 magrittr             * 2.0.3      2022-03-30 [1] CRAN (R 4.2.0)
 MASS                   7.3-60     2023-05-04 [4] CRAN (R 4.3.1)
 Matrix                 1.6-5      2024-01-11 [1] CRAN (R 4.2.3)
 matrixcalc             1.0-6      2022-09-14 [1] CRAN (R 4.3.2)
 MatrixGenerics       * 1.12.3     2023-07-30 [2] Bioconductor
 matrixStats          * 1.4.1      2024-09-08 [2] CRAN (R 4.3.3)
 mclust                 6.1.1      2024-04-29 [2] CRAN (R 4.3.3)
 memoise                2.0.1      2021-11-26 [2] CRAN (R 4.3.1)
 mgcv                   1.9-1      2023-12-21 [4] CRAN (R 4.3.2)
 mime                   0.12       2021-09-28 [2] CRAN (R 4.3.1)
 miniUI                 0.1.1.1    2018-05-18 [2] CRAN (R 4.3.1)
 minqa                  1.2.7      2024-05-20 [1] CRAN (R 4.2.3)
 modeldata            * 1.3.0      2024-01-21 [1] CRAN (R 4.2.3)
 munsell                0.5.1      2024-04-01 [2] CRAN (R 4.3.3)
 mvtnorm                1.3-1      2024-09-03 [2] CRAN (R 4.3.3)
 nanonext               1.1.0      2024-06-04 [1] CRAN (R 4.3.3)
 nlme                   3.1-166    2024-08-14 [4] CRAN (R 4.3.3)
 nloptr                 2.1.1      2024-06-25 [2] CRAN (R 4.3.3)
 nnet                   7.3-19     2023-05-03 [1] CRAN (R 4.2.3)
 numDeriv               2016.8-1.1 2019-06-06 [2] CRAN (R 4.3.1)
 org.Hs.eg.db           3.17.0     2024-01-31 [2] Bioconductor
 parallelly             1.37.1     2024-02-29 [1] CRAN (R 4.2.3)
 parsnip              * 1.2.1      2024-03-22 [1] CRAN (R 4.2.3)
 pbapply                1.7-2      2023-06-27 [2] CRAN (R 4.3.1)
 pheatmap               1.0.12     2019-01-04 [1] CRAN (R 4.3.3)
 pillar                 1.9.0      2023-03-22 [2] CRAN (R 4.3.1)
 pkgbuild               1.4.4      2024-03-17 [2] CRAN (R 4.3.3)
 pkgconfig              2.0.3      2019-09-22 [2] CRAN (R 4.3.1)
 pkgload                1.4.0      2024-06-28 [2] CRAN (R 4.3.3)
 plyr                   1.8.9      2023-10-02 [2] CRAN (R 4.3.3)
 png                    0.1-8      2022-11-29 [2] CRAN (R 4.3.1)
 princurve              2.1.6      2021-01-18 [1] CRAN (R 4.3.2)
 processx               3.8.4      2024-03-16 [2] CRAN (R 4.3.3)
 prodlim                2024.06.25 2024-06-24 [2] CRAN (R 4.3.3)
 profvis                0.4.0      2024-09-20 [2] CRAN (R 4.3.3)
 promises               1.3.0      2024-04-05 [2] CRAN (R 4.3.3)
 ps                     1.8.0      2024-09-12 [2] CRAN (R 4.3.3)
 purrr                * 1.0.2      2023-08-10 [1] CRAN (R 4.2.3)
 qs                   * 0.26.3     2024-05-16 [1] CRAN (R 4.3.3)
 R6                     2.5.1      2021-08-19 [2] CRAN (R 4.3.1)
 RApiSerialize          0.1.3      2024-05-14 [1] CRAN (R 4.3.3)
 RColorBrewer           1.1-3      2022-04-03 [2] CRAN (R 4.3.1)
 Rcpp                   1.0.13     2024-07-17 [2] CRAN (R 4.3.3)
 RcppEigen              0.3.4.0.0  2024-02-28 [1] CRAN (R 4.2.3)
 RcppParallel           5.1.7      2023-02-27 [1] CRAN (R 4.3.2)
 RCurl                  1.98-1.16  2024-07-11 [2] CRAN (R 4.3.3)
 readr                * 2.1.5      2024-01-10 [2] CRAN (R 4.3.3)
 recipes              * 1.0.10     2024-02-18 [1] CRAN (R 4.2.3)
 remotes                2.5.0      2024-03-17 [2] CRAN (R 4.3.3)
 reshape2               1.4.4      2020-04-09 [2] CRAN (R 4.3.1)
 rhdf5                  2.44.0     2023-04-25 [2] Bioconductor
 rhdf5filters           1.12.1     2023-04-30 [2] Bioconductor
 Rhdf5lib               1.22.1     2023-09-10 [2] Bioconductor
 rjson                  0.2.23     2024-09-16 [2] CRAN (R 4.3.3)
 rlang                  1.1.4      2024-06-04 [1] CRAN (R 4.3.3)
 rmarkdown            * 2.27       2024-05-17 [1] CRAN (R 4.3.3)
 rpart                  4.1.23     2023-12-05 [4] CRAN (R 4.3.2)
 rsample              * 1.2.1      2024-03-25 [1] CRAN (R 4.2.3)
 RSQLite                2.3.7      2024-05-27 [2] CRAN (R 4.3.3)
 rstudioapi             0.16.0     2024-03-24 [1] CRAN (R 4.2.3)
 S4Arrays               1.2.1      2024-03-04 [1] Bioconductor 3.18 (R 4.3.2)
 S4Vectors            * 0.38.2     2023-09-22 [2] Bioconductor
 sass                   0.4.9      2024-03-15 [1] CRAN (R 4.2.3)
 scales               * 1.3.0      2023-11-28 [1] CRAN (R 4.2.3)
 scattermore            1.2        2023-06-12 [2] CRAN (R 4.3.1)
 scLANE               * 0.8.4      2024-10-05 [1] Github (jr-leary7/scLANE@d1eb84d)
 secretbase             0.5.0      2024-04-25 [1] CRAN (R 4.3.3)
 sessioninfo            1.2.2      2021-12-06 [2] CRAN (R 4.3.1)
 shape                  1.4.6.1    2024-02-23 [2] CRAN (R 4.3.3)
 shiny                  1.9.1      2024-08-01 [2] CRAN (R 4.3.3)
 SingleCellExperiment * 1.22.0     2023-04-25 [2] Bioconductor
 slingshot              2.6.0      2022-11-01 [1] Bioconductor
 snow                   0.4-4      2021-10-27 [2] CRAN (R 4.3.1)
 SparseM                1.84-2     2024-07-17 [2] CRAN (R 4.3.3)
 stringfish             0.16.0     2023-11-28 [1] CRAN (R 4.2.3)
 stringi                1.8.4      2024-05-06 [2] CRAN (R 4.3.3)
 stringr              * 1.5.1      2023-11-14 [2] CRAN (R 4.3.2)
 SummarizedExperiment * 1.30.2     2023-06-06 [2] Bioconductor
 survival               3.7-0      2024-06-05 [4] CRAN (R 4.3.3)
 tarchetypes          * 0.9.0      2024-04-17 [1] CRAN (R 4.3.3)
 targets              * 1.6.0      2024-03-13 [1] CRAN (R 4.3.3)
 tibble               * 3.2.1      2023-03-20 [2] CRAN (R 4.3.1)
 tidymodels           * 1.2.0      2024-03-25 [1] CRAN (R 4.2.3)
 tidyr                * 1.3.1      2024-01-24 [1] CRAN (R 4.2.3)
 tidyselect             1.2.1      2024-03-11 [2] CRAN (R 4.3.3)
 tidyverse            * 2.0.0      2023-02-22 [1] CRAN (R 4.2.3)
 timechange             0.3.0      2024-01-18 [2] CRAN (R 4.3.3)
 timeDate               4041.110   2024-09-22 [2] CRAN (R 4.3.3)
 TMB                    1.9.11     2024-04-03 [1] CRAN (R 4.3.3)
 topGO                  2.52.0     2023-04-25 [1] Bioconductor
 tradeSeq             * 1.14.0     2023-04-25 [1] Bioconductor
 TrajectoryUtils        1.6.0      2022-11-01 [1] Bioconductor
 TSCAN                  1.36.0     2022-11-01 [1] Bioconductor
 tune                 * 1.2.0      2024-03-20 [1] CRAN (R 4.2.3)
 tzdb                   0.4.0      2023-05-12 [2] CRAN (R 4.3.1)
 urlchecker             1.0.1      2021-11-30 [2] CRAN (R 4.3.1)
 usethis                2.2.3      2024-02-19 [1] CRAN (R 4.2.3)
 utf8                   1.2.4      2023-10-22 [2] CRAN (R 4.3.1)
 vctrs                  0.6.5      2023-12-01 [2] CRAN (R 4.3.1)
 viridis                0.6.5      2024-01-29 [2] CRAN (R 4.3.3)
 viridisLite            0.4.2      2023-05-02 [2] CRAN (R 4.3.1)
 withr                  3.0.0      2024-01-16 [1] CRAN (R 4.2.3)
 workflows            * 1.1.4      2024-02-19 [1] CRAN (R 4.2.3)
 workflowsets         * 1.1.0      2024-03-21 [1] CRAN (R 4.2.3)
 xfun                   0.44       2024-05-15 [1] CRAN (R 4.3.3)
 xtable                 1.8-4      2019-04-21 [2] CRAN (R 4.3.1)
 XVector                0.40.0     2023-04-25 [2] Bioconductor
 yaml                   2.3.10     2024-07-26 [2] CRAN (R 4.3.3)
 yardstick            * 1.3.1      2024-03-21 [1] CRAN (R 4.2.3)
 zlibbioc               1.46.0     2023-04-25 [2] Bioconductor

 [1] /home/j.leary/r_packages_default
 [2] /usr/local/lib/R/site-library
 [3] /usr/lib/R/site-library
 [4] /usr/lib/R/library

──────────────────────────────────────────────────────────────────────────────
LS0tCnRpdGxlOiAiYHNjTEFORWAgU2ltdWxhdGlvbiBTdHVkeSAtIFRyYWplY3RvcnkgREUgTWV0aG9kIENvbXBhcmlzb24iCnN1YnRpdGxlOiAiVUYgRGVwdC4gb2YgQmlvc3RhdGlzdGljcyAtIEJhY2hlciBHcm91cCIKYXV0aG9yOiAiSmFjayBMZWFyeSIgCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogam91cm5hbAogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlIAogICAgdG9jOiB0cnVlIAogICAgdG9jX2RlcHRoOiAyCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGRmX3ByaW50OiBrYWJsZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBjb21tZW50ID0gTkEsIGRldiA9ICJwbmciLCBkcGkgPSAzMjApCmBgYAoKIyBMaWJyYXJpZXMgCgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHRhcmdldHMpCmBgYAoKIyBIZWxwZXIgRnVuY3Rpb25zCgpgYGB7cn0Kc291cmNlKCJSL2Z1bmN0aW9uc19hbmFseXNpcy5SIikKYGBgCgojIERhdGEKCmBgYHtyfQp0YXJfbG9hZChtZXRyaWNfdGFibGVfbWFzdGVyKQpgYGAKCiMgQW5hbHlzaXMKCiMjIFJlZmVyZW5jZSBEYXRhc2V0CgpgYGB7cn0KZmlsdGVyKG1ldHJpY190YWJsZV9tYXN0ZXIsIAogICAgICAgTU9ERUxfVFlQRSAlaW4lIGMoInNjTEFORSAtIEdMTSIsICJ0cmFkZVNlcSIpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gUk9DX0FVQywgeSA9IFNJTV9SRUZFUkVOQ0UsIGNvbG9yID0gTU9ERUxfVFlQRSwgZmlsbCA9IE1PREVMX1RZUEUpKSArIAogIGZhY2V0X3dyYXAofk1PREVMX1RZUEUpICsgCiAgZ2dyaWRnZXM6Omdlb21fZGVuc2l0eV9yaWRnZXMoYWxwaGEgPSAwLjYsIHNjYWxlID0gMC45NSwgbGluZXdpZHRoID0gMSkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpsYWJlbF9wZXJjZW50KCkpICsgCiAgbGFicyh5ID0gIlJlZmVyZW5jZSBEYXRhc2V0IiwgeCA9ICJST0MtQVVDIikgKyAKICB0aGVtZV9hbmFseXNpcygpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCmBgYHtyfQpmaWx0ZXIobWV0cmljX3RhYmxlX21hc3RlciwgCiAgICAgICBNT0RFTF9UWVBFICVpbiUgYygic2NMQU5FIC0gR0xNIiwgInRyYWRlU2VxIikpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBGX01FQVNVUkUsIHkgPSBTSU1fUkVGRVJFTkNFLCBjb2xvciA9IE1PREVMX1RZUEUsIGZpbGwgPSBNT0RFTF9UWVBFKSkgKyAKICBmYWNldF93cmFwKH5NT0RFTF9UWVBFKSArIAogIGdncmlkZ2VzOjpnZW9tX2RlbnNpdHlfcmlkZ2VzKGFscGhhID0gMC42LCBzY2FsZSA9IDAuOTUsIGxpbmV3aWR0aCA9IDEpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6bGFiZWxfbnVtYmVyKGFjY3VyYWN5ID0gMC4xKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoTkEsIDEpKSArIAogIGxhYnMoeSA9ICJSZWZlcmVuY2UgRGF0YXNldCIsIHggPSAiRi1tZWFzdXJlIikgKyAKICB0aGVtZV9hbmFseXNpcygpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCiMjIFJ1bnRpbWUKCmBgYHtyfQpmaWx0ZXIobWV0cmljX3RhYmxlX21hc3RlciwgCiAgICAgICBNT0RFTF9UWVBFICVpbiUgYygic2NMQU5FIC0gR0xNIiwgInRyYWRlU2VxIikpICU+JSAKICBtdXRhdGUoTl9DRUxMUyA9IHJvdW5kKE5fQ0VMTFMsIGRpZ2l0cyA9IC0xKSwgCiAgICAgICAgIE5fQ0VMTFMgPSBhcy5mYWN0b3IoTl9DRUxMUyksIAogICAgICAgICBSVU5USU1FX01JTlMgPSBSVU5USU1FX0hPVVJTICogNjApICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBOX0NFTExTLCB5ID0gUlVOVElNRV9NSU5TLCBjb2xvciA9IE1PREVMX1RZUEUpKSArIAogIGdlb21fYm94cGxvdCgpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6bGFiZWxfbnVtYmVyKGFjY3VyYWN5ID0gMSwgc3VmZml4ID0gIm1pbiIpKSArIAogIGxhYnMoeCA9ICJDZWxscyIsIHkgPSAiUnVudGltZSIpICsgCiAgdGhlbWVfYW5hbHlzaXMoKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7cn0KZmlsdGVyKG1ldHJpY190YWJsZV9tYXN0ZXIsIAogICAgICAgTU9ERUxfVFlQRSAlaW4lIGMoInNjTEFORSAtIEdMTSIsICJ0cmFkZVNlcSIpKSAlPiUgCiAgbXV0YXRlKFJVTlRJTUVfTUlOUyA9IFJVTlRJTUVfSE9VUlMgKiA2MCwgCiAgICAgICAgIEdFTkVTX1BFUl9NSU4gPSBOX0dFTkVTIC8gUlVOVElNRV9NSU5TKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gTl9DRUxMUywgeSA9IEdFTkVTX1BFUl9NSU4sIGNvbG9yID0gTU9ERUxfVFlQRSwgZmlsbCA9IE1PREVMX1RZUEUpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGFscGhhID0gMC4yNSkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpsYWJlbF9udW1iZXIoYWNjdXJhY3kgPSAxKSkgKyAKICBsYWJzKHggPSAiQ2VsbHMiLCB5ID0gIkdlbmVzIHBlciBNaW51dGUiKSArIAogIHRoZW1lX2FuYWx5c2lzKCkgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsgCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAwLCBsaW5ld2lkdGggPSAyKSkpCmBgYAoKYGBge3J9CmZpbHRlcihtZXRyaWNfdGFibGVfbWFzdGVyLCAKICAgICAgIE1PREVMX1RZUEUgJWluJSBjKCJzY0xBTkUgLSBHTE0iLCAidHJhZGVTZXEiKSkgJT4lIAogIG11dGF0ZShSVU5USU1FX01JTlMgPSBSVU5USU1FX0hPVVJTICogNjAsIAogICAgICAgICBHRU5FU19QRVJfTUlOID0gTl9HRU5FUyAvIFJVTlRJTUVfTUlOUykgJT4lIAogIGdncGxvdChhZXMoeCA9IEdFTkVTX1BFUl9NSU4sIGNvbG9yID0gTU9ERUxfVFlQRSwgZmlsbCA9IE1PREVMX1RZUEUpKSArIAogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuMywgbGluZXdpZHRoID0gMSkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpsYWJlbF9udW1iZXIoYWNjdXJhY3kgPSAxKSkgKyAKICBsYWJzKHggPSAiR2VuZXMgcGVyIE1pbnV0ZSIsIHkgPSAiRGVuc2l0eSIpICsgCiAgdGhlbWVfYW5hbHlzaXMoKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyAKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEsIGNvbG9yID0gIndoaXRlIiwgbGluZXdpZHRoID0gMC41KSkpCmBgYAoKIyMgTWVtb3J5IFVzYWdlCgpgYGB7cn0KZmlsdGVyKG1ldHJpY190YWJsZV9tYXN0ZXIsIAogICAgICAgTU9ERUxfVFlQRSAlaW4lIGMoInNjTEFORSAtIEdMTSIsICJ0cmFkZVNlcSIpKSAlPiUgCiAgbXV0YXRlKE5fQ0VMTFMgPSByb3VuZChOX0NFTExTLCBkaWdpdHMgPSAtMSksIAogICAgICAgICBOX0NFTExTID0gYXMuZmFjdG9yKE5fQ0VMTFMpLCAKICAgICAgICAgTUVNX1VTRURfR0IgPSBNRU1fVVNFRCAvIDEwMDApICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBOX0NFTExTLCB5ID0gTUVNX1VTRURfR0IsIGNvbG9yID0gTU9ERUxfVFlQRSkpICsgCiAgZ2VvbV9ib3hwbG90KCkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpsYWJlbF9udW1iZXIoc3VmZml4ID0gImdiIikpICsgCiAgbGFicyh4ID0gIkNlbGxzIiwgeSA9ICJNZW1vcnkgVXNhZ2UiKSArIAogIHRoZW1lX2FuYWx5c2lzKCkgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKYGBge3J9CmZpbHRlcihtZXRyaWNfdGFibGVfbWFzdGVyLCAKICAgICAgIE1PREVMX1RZUEUgJWluJSBjKCJzY0xBTkUgLSBHTE0iLCAidHJhZGVTZXEiKSkgJT4lIAogIG11dGF0ZShNRU1fVVNFRF9HQiA9IE1FTV9VU0VEIC8gMTAwMCkgJT4lIAogIGdncGxvdChhZXMoeCA9IE1FTV9VU0VEX0dCLCBjb2xvciA9IE1PREVMX1RZUEUsIGZpbGwgPSBNT0RFTF9UWVBFKSkgKyAKICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjMsIGxpbmV3aWR0aCA9IDEpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6bGFiZWxfbnVtYmVyKHN1ZmZpeCA9ICJnYiIpKSArIAogIGxhYnMoeCA9ICJNZW1vcnkgVXNhZ2UiLCB5ID0gIkRlbnNpdHkiKSArIAogIHRoZW1lX2FuYWx5c2lzKCkgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsgCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxLCBjb2xvciA9ICJ3aGl0ZSIsIGxpbmV3aWR0aCA9IDAuNSkpKQpgYGAKCiMjIFByZWRpY3RpdmUgUGVyZm9ybWFuY2UKCiMjIyBGLW1lYXN1cmUgCgpgYGB7cn0KZmlsdGVyKG1ldHJpY190YWJsZV9tYXN0ZXIsIAogICAgICAgTU9ERUxfVFlQRSAlaW4lIGMoInNjTEFORSAtIEdMTSIsICJ0cmFkZVNlcSIpKSAlPiUgCiAgbXV0YXRlKE5fQ0VMTFMgPSByb3VuZChOX0NFTExTLCBkaWdpdHMgPSAtMSksIAogICAgICAgICBOX0NFTExTID0gYXMuZmFjdG9yKE5fQ0VMTFMpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gTl9DRUxMUywgeSA9IEZfTUVBU1VSRSwgY29sb3IgPSBNT0RFTF9UWVBFKSkgKyAKICBnZW9tX2JveHBsb3QoKSArIAogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmxhYmVsX251bWJlcihhY2N1cmFjeSA9IDAuMSkpICsgCiAgbGFicyh4ID0gIkNlbGxzIiwgeSA9ICJGLW1lYXN1cmUiKSArIAogIHRoZW1lX2FuYWx5c2lzKCkgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKYGBge3J9CmZpbHRlcihtZXRyaWNfdGFibGVfbWFzdGVyLCAKICAgICAgIE1PREVMX1RZUEUgJWluJSBjKCJzY0xBTkUgLSBHTE0iLCAidHJhZGVTZXEiKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IEZfTUVBU1VSRSwgY29sb3IgPSBNT0RFTF9UWVBFLCBmaWxsID0gTU9ERUxfVFlQRSkpICsgCiAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC4zLCBsaW5ld2lkdGggPSAxKSArIAogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmxhYmVsX251bWJlcihhY2N1cmFjeSA9IDAuMSkpICsgCiAgbGFicyh4ID0gIkYtbWVhc3VyZSIsIHkgPSAiRGVuc2l0eSIpICsgCiAgdGhlbWVfYW5hbHlzaXMoKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyAKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEsIGNvbG9yID0gIndoaXRlIiwgbGluZXdpZHRoID0gMC41KSkpCmBgYAoKIyMjIEJhbGFuY2VkIEFjY3VyYWN5IAoKYGBge3J9CmZpbHRlcihtZXRyaWNfdGFibGVfbWFzdGVyLCAKICAgICAgIE1PREVMX1RZUEUgJWluJSBjKCJzY0xBTkUgLSBHTE0iLCAidHJhZGVTZXEiKSkgJT4lIAogIG11dGF0ZShOX0NFTExTID0gcm91bmQoTl9DRUxMUywgZGlnaXRzID0gLTEpLCAKICAgICAgICAgTl9DRUxMUyA9IGFzLmZhY3RvcihOX0NFTExTKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IE5fQ0VMTFMsIHkgPSBCQUxfQUNDVVJBQ1ksIGNvbG9yID0gTU9ERUxfVFlQRSkpICsgCiAgZ2VvbV9ib3hwbG90KCkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpsYWJlbF9wZXJjZW50KGFjY3VyYWN5ID0gMSkpICsgCiAgbGFicyh4ID0gIkNlbGxzIiwgeSA9ICJCYWxhbmNlZCBBY2N1cmFjeSIpICsgCiAgdGhlbWVfYW5hbHlzaXMoKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7cn0KZmlsdGVyKG1ldHJpY190YWJsZV9tYXN0ZXIsIAogICAgICAgTU9ERUxfVFlQRSAlaW4lIGMoInNjTEFORSAtIEdMTSIsICJ0cmFkZVNlcSIpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gQkFMX0FDQ1VSQUNZLCBjb2xvciA9IE1PREVMX1RZUEUsIGZpbGwgPSBNT0RFTF9UWVBFKSkgKyAKICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjMsIGxpbmV3aWR0aCA9IDEpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6bGFiZWxfcGVyY2VudChhY2N1cmFjeSA9IDEpKSArIAogIGxhYnMoeCA9ICJCYWxhbmNlZCBBY2N1cmFjeSIsIHkgPSAiRGVuc2l0eSIpICsgCiAgdGhlbWVfYW5hbHlzaXMoKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyAKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEsIGNvbG9yID0gIndoaXRlIiwgbGluZXdpZHRoID0gMC41KSkpCmBgYAoKIyMjIFJlY2FsbAoKYGBge3J9CmZpbHRlcihtZXRyaWNfdGFibGVfbWFzdGVyLCAKICAgICAgIE1PREVMX1RZUEUgJWluJSBjKCJzY0xBTkUgLSBHTE0iLCAidHJhZGVTZXEiKSkgJT4lIAogIG11dGF0ZShOX0NFTExTID0gcm91bmQoTl9DRUxMUywgZGlnaXRzID0gLTEpLCAKICAgICAgICAgTl9DRUxMUyA9IGFzLmZhY3RvcihOX0NFTExTKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IE5fQ0VMTFMsIHkgPSBSRUNBTEwsIGNvbG9yID0gTU9ERUxfVFlQRSkpICsgCiAgZ2VvbV9ib3hwbG90KCkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpsYWJlbF9wZXJjZW50KGFjY3VyYWN5ID0gMSkpICsgCiAgbGFicyh4ID0gIkNlbGxzIiwgeSA9ICJSZWNhbGwiKSArIAogIHRoZW1lX2FuYWx5c2lzKCkgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKYGBge3J9CmZpbHRlcihtZXRyaWNfdGFibGVfbWFzdGVyLCAKICAgICAgIE1PREVMX1RZUEUgJWluJSBjKCJzY0xBTkUgLSBHTE0iLCAidHJhZGVTZXEiKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IFJFQ0FMTCwgY29sb3IgPSBNT0RFTF9UWVBFLCBmaWxsID0gTU9ERUxfVFlQRSkpICsgCiAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC4zLCBsaW5ld2lkdGggPSAxKSArIAogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmxhYmVsX3BlcmNlbnQoYWNjdXJhY3kgPSAxKSkgKyAKICBsYWJzKHggPSAiUmVjYWxsIiwgeSA9ICJEZW5zaXR5IikgKyAKICB0aGVtZV9hbmFseXNpcygpICsgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArIAogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSwgY29sb3IgPSAid2hpdGUiLCBsaW5ld2lkdGggPSAwLjUpKSkKYGBgCgojIyMgQWNjdXJhY3kKCmBgYHtyfQpmaWx0ZXIobWV0cmljX3RhYmxlX21hc3RlciwgCiAgICAgICBNT0RFTF9UWVBFICVpbiUgYygic2NMQU5FIC0gR0xNIiwgInRyYWRlU2VxIikpICU+JSAKICBtdXRhdGUoTl9DRUxMUyA9IHJvdW5kKE5fQ0VMTFMsIGRpZ2l0cyA9IC0xKSwgCiAgICAgICAgIE5fQ0VMTFMgPSBhcy5mYWN0b3IoTl9DRUxMUykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBOX0NFTExTLCB5ID0gQUNDVVJBQ1kpKSArIAogIGdlb21fYm94cGxvdChhZXMoY29sb3IgPSBNT0RFTF9UWVBFKSkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpsYWJlbF9wZXJjZW50KGFjY3VyYWN5ID0gMSkpICsgCiAgbGFicyh4ID0gIkNlbGxzIiwgeSA9ICJBY2N1cmFjeSIpICsgCiAgdGhlbWVfYW5hbHlzaXMoKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7cn0KZmlsdGVyKG1ldHJpY190YWJsZV9tYXN0ZXIsIAogICAgICAgTU9ERUxfVFlQRSAlaW4lIGMoInNjTEFORSAtIEdMTSIsICJ0cmFkZVNlcSIpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gQUNDVVJBQ1ksIGNvbG9yID0gTU9ERUxfVFlQRSwgZmlsbCA9IE1PREVMX1RZUEUpKSArIAogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuMywgbGluZXdpZHRoID0gMSkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpsYWJlbF9wZXJjZW50KGFjY3VyYWN5ID0gMSkpICsgCiAgbGFicyh4ID0gIkFjY3VyYWN5IiwgeSA9ICJEZW5zaXR5IikgKyAKICB0aGVtZV9hbmFseXNpcygpICsgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArIAogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSwgY29sb3IgPSAid2hpdGUiLCBsaW5ld2lkdGggPSAwLjUpKSkKYGBgCgojIyMgUk9DLUFVQwoKYGBge3J9CmZpbHRlcihtZXRyaWNfdGFibGVfbWFzdGVyLCAKICAgICAgIE1PREVMX1RZUEUgJWluJSBjKCJzY0xBTkUgLSBHTE0iLCAidHJhZGVTZXEiKSkgJT4lIAogIG11dGF0ZShOX0NFTExTID0gcm91bmQoTl9DRUxMUywgZGlnaXRzID0gLTEpLCAKICAgICAgICAgTl9DRUxMUyA9IGFzLmZhY3RvcihOX0NFTExTKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IE5fQ0VMTFMsIHkgPSBST0NfQVVDLCBjb2xvciA9IE1PREVMX1RZUEUpKSArIAogIGdlb21fYm94cGxvdCgpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6bGFiZWxfcGVyY2VudChhY2N1cmFjeSA9IDEpKSArIAogIGxhYnMoeCA9ICJDZWxscyIsIHkgPSAiUk9DLUFVQyIpICsgCiAgdGhlbWVfYW5hbHlzaXMoKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7cn0KZmlsdGVyKG1ldHJpY190YWJsZV9tYXN0ZXIsIAogICAgICAgTU9ERUxfVFlQRSAlaW4lIGMoInNjTEFORSAtIEdMTSIsICJ0cmFkZVNlcSIpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gUk9DX0FVQywgY29sb3IgPSBNT0RFTF9UWVBFLCBmaWxsID0gTU9ERUxfVFlQRSkpICsgCiAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC4zLCBsaW5ld2lkdGggPSAxKSArIAogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmxhYmVsX3BlcmNlbnQoYWNjdXJhY3kgPSAxKSkgKyAKICBsYWJzKHggPSAiUk9DLUFVQyIsIHkgPSAiRGVuc2l0eSIpICsgCiAgdGhlbWVfYW5hbHlzaXMoKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyAKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEsIGNvbG9yID0gIndoaXRlIiwgbGluZXdpZHRoID0gMC41KSkpCmBgYAoKYGBge3J9CmZpbHRlcihtZXRyaWNfdGFibGVfbWFzdGVyLCAKICAgICAgIE1PREVMX1RZUEUgJWluJSBjKCJzY0xBTkUgLSBHTE0iKSkgJT4lIAogIHB1bGwoUk9DX0NVUlZFKSAlPiUgCiAgcHVycnI6OnJlZHVjZShyYmluZCkgJT4lIAogIGxlZnRfam9pbigoZGlzdGluY3QobWV0cmljX3RhYmxlX21hc3RlciwgREFUQVNFVF9OQU1FLCBOX0NFTExTKSksIAogICAgICAgICAgICBieSA9IGMoImRhdGFzZXQiID0gIkRBVEFTRVRfTkFNRSIpKSAlPiUgCiAgbXV0YXRlKE5fQ0VMTFMgPSByb3VuZChOX0NFTExTLCBkaWdpdHMgPSAtMSksIAogICAgICAgICBOX0NFTExTID0gYXMuZmFjdG9yKE5fQ0VMTFMpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gMSAtIHNwZWNpZmljaXR5LCB5ID0gc2Vuc2l0aXZpdHksIGdyb3VwID0gZGF0YXNldCwgY29sb3IgPSBOX0NFTExTKSkgKyAKICBmYWNldF93cmFwKH5wYXN0ZTAoIkNlbGxzOiAiLCBOX0NFTExTKSkgKyAKICBnZW9tX3NlZ21lbnQoeCA9IDAsIHhlbmQgPSAwLCB5ID0gMSwgeWVuZCA9IDEsIGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDEpICsgCiAgZ2VvbV9saW5lKHNpemUgPSAxLCBhbHBoYSA9IDAuOCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArIAogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsgCiAgbGFicyh4ID0gIjEgLSBTcGVjaWZpY2l0eSIsIAogICAgICB5ID0gIlNlbnNpdGl2aXR5IiwgCiAgICAgIGNvbG9yID0gIkNlbGxzIiwgCiAgICAgIHRpdGxlID0gInNjTEFORSAtIEdMTSIpICsgCiAgdGhlbWVfYW5hbHlzaXMoKSArICAKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChsaW5ld2lkdGggPSAyLCBhbHBoYSA9IDEpKSkKYGBgCgpgYGB7cn0KZmlsdGVyKG1ldHJpY190YWJsZV9tYXN0ZXIsIAogICAgICAgTU9ERUxfVFlQRSAlaW4lIGMoInRyYWRlU2VxIikpICU+JSAKICBwdWxsKFJPQ19DVVJWRSkgJT4lIAogIHB1cnJyOjpyZWR1Y2UocmJpbmQpICU+JSAKICBsZWZ0X2pvaW4oKGRpc3RpbmN0KG1ldHJpY190YWJsZV9tYXN0ZXIsIERBVEFTRVRfTkFNRSwgTl9DRUxMUykpLCAKICAgICAgICAgICAgYnkgPSBjKCJkYXRhc2V0IiA9ICJEQVRBU0VUX05BTUUiKSkgJT4lIAogIG11dGF0ZShOX0NFTExTID0gcm91bmQoTl9DRUxMUywgZGlnaXRzID0gLTEpLCAKICAgICAgICAgTl9DRUxMUyA9IGFzLmZhY3RvcihOX0NFTExTKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IDEgLSBzcGVjaWZpY2l0eSwgeSA9IHNlbnNpdGl2aXR5LCBncm91cCA9IGRhdGFzZXQsIGNvbG9yID0gTl9DRUxMUykpICsgCiAgZmFjZXRfd3JhcCh+cGFzdGUwKCJDZWxsczogIiwgTl9DRUxMUykpICsgCiAgZ2VvbV9zZWdtZW50KHggPSAwLCB4ZW5kID0gMCwgeSA9IDEsIHllbmQgPSAxLCBjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAxKSArIAogIGdlb21fbGluZShzaXplID0gMSwgYWxwaGEgPSAwLjgpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArIAogIGxhYnMoeCA9ICIxIC0gU3BlY2lmaWNpdHkiLCAKICAgICAgeSA9ICJTZW5zaXRpdml0eSIsIAogICAgICBjb2xvciA9ICJDZWxscyIsIAogICAgICB0aXRsZSA9ICJ0cmFkZVNlcSIpICsgCiAgdGhlbWVfYW5hbHlzaXMoKSArIAogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGxpbmV3aWR0aCA9IDIsIGFscGhhID0gMSkpKQpgYGAKCiMjIyBQUi1BVUMKCmBgYHtyfQpmaWx0ZXIobWV0cmljX3RhYmxlX21hc3RlciwgCiAgICAgICBNT0RFTF9UWVBFICVpbiUgYygic2NMQU5FIC0gR0xNIiwgInRyYWRlU2VxIikpICU+JSAKICBtdXRhdGUoTl9DRUxMUyA9IHJvdW5kKE5fQ0VMTFMsIGRpZ2l0cyA9IC0xKSwgCiAgICAgICAgIE5fQ0VMTFMgPSBhcy5mYWN0b3IoTl9DRUxMUykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBOX0NFTExTLCB5ID0gQVVDX1BSLCBjb2xvciA9IE1PREVMX1RZUEUpKSArIAogIGdlb21fYm94cGxvdCgpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6bGFiZWxfcGVyY2VudChhY2N1cmFjeSA9IDEpKSArIAogIGxhYnMoeCA9ICJDZWxscyIsIHkgPSAiUFItQVVDIikgKyAKICB0aGVtZV9hbmFseXNpcygpICsgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCmBgYHtyfQpmaWx0ZXIobWV0cmljX3RhYmxlX21hc3RlciwgCiAgICAgICBNT0RFTF9UWVBFICVpbiUgYygic2NMQU5FIC0gR0xNIiwgInRyYWRlU2VxIikpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBBVUNfUFIsIGNvbG9yID0gTU9ERUxfVFlQRSwgZmlsbCA9IE1PREVMX1RZUEUpKSArIAogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuMywgbGluZXdpZHRoID0gMSkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpsYWJlbF9wZXJjZW50KGFjY3VyYWN5ID0gMSkpICsgCiAgbGFicyh4ID0gIlBSLUFVQyIsIHkgPSAiRGVuc2l0eSIpICsgCiAgdGhlbWVfYW5hbHlzaXMoKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyAKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEsIGNvbG9yID0gIndoaXRlIiwgbGluZXdpZHRoID0gMC41KSkpCmBgYAoKYGBge3J9CmZpbHRlcihtZXRyaWNfdGFibGVfbWFzdGVyLCAKICAgICAgIE1PREVMX1RZUEUgJWluJSBjKCJzY0xBTkUgLSBHTE0iKSkgJT4lIAogIHB1bGwoUFJfQ1VSVkUpICU+JSAKICBwdXJycjo6cmVkdWNlKHJiaW5kKSAlPiUgCiAgbGVmdF9qb2luKChkaXN0aW5jdChtZXRyaWNfdGFibGVfbWFzdGVyLCBEQVRBU0VUX05BTUUsIE5fQ0VMTFMpKSwgCiAgICAgICAgICAgIGJ5ID0gYygiZGF0YXNldCIgPSAiREFUQVNFVF9OQU1FIikpICU+JSAKICBtdXRhdGUoTl9DRUxMUyA9IHJvdW5kKE5fQ0VMTFMsIGRpZ2l0cyA9IC0xKSwgCiAgICAgICAgIE5fQ0VMTFMgPSBhcy5mYWN0b3IoTl9DRUxMUykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSByZWNhbGwsIHkgPSBwcmVjaXNpb24sIGdyb3VwID0gZGF0YXNldCwgY29sb3IgPSBOX0NFTExTKSkgKyAKICBmYWNldF93cmFwKH5wYXN0ZTAoIkNlbGxzOiAiLCBOX0NFTExTKSkgKyAKICBnZW9tX3NlZ21lbnQoeCA9IDAsIHhlbmQgPSAxLCB5ID0gMSwgeWVuZCA9IDAsIGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDEpICsgCiAgZ2VvbV9saW5lKHNpemUgPSAxLCBhbHBoYSA9IDAuOCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSksIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogIGxhYnMoeCA9ICJSZWNhbGwiLCAKICAgICAgIHkgPSAiUHJlY2lzaW9uIiwgCiAgICAgICBjb2xvciA9ICJDZWxscyIsIAogICAgICAgdGl0bGUgPSAic2NMQU5FIC0gR0xNIikgKyAKICB0aGVtZV9hbmFseXNpcygpICsgCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QobGluZXdpZHRoID0gMiwgYWxwaGEgPSAxKSkpCmBgYAoKYGBge3J9CmZpbHRlcihtZXRyaWNfdGFibGVfbWFzdGVyLCAKICAgICAgIE1PREVMX1RZUEUgJWluJSBjKCJ0cmFkZVNlcSIpKSAlPiUgCiAgcHVsbChQUl9DVVJWRSkgJT4lIAogIHB1cnJyOjpyZWR1Y2UocmJpbmQpICU+JSAKICBsZWZ0X2pvaW4oKGRpc3RpbmN0KG1ldHJpY190YWJsZV9tYXN0ZXIsIERBVEFTRVRfTkFNRSwgTl9DRUxMUykpLCAKICAgICAgICAgICAgYnkgPSBjKCJkYXRhc2V0IiA9ICJEQVRBU0VUX05BTUUiKSkgJT4lIAogIG11dGF0ZShOX0NFTExTID0gcm91bmQoTl9DRUxMUywgZGlnaXRzID0gLTEpLCAKICAgICAgICAgTl9DRUxMUyA9IGFzLmZhY3RvcihOX0NFTExTKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHJlY2FsbCwgeSA9IHByZWNpc2lvbiwgZ3JvdXAgPSBkYXRhc2V0LCBjb2xvciA9IE5fQ0VMTFMpKSArIAogIGZhY2V0X3dyYXAofnBhc3RlMCgiQ2VsbHM6ICIsIE5fQ0VMTFMpKSArIAogIGdlb21fc2VnbWVudCh4ID0gMCwgeGVuZCA9IDEsIHkgPSAxLCB5ZW5kID0gMCwgY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0gMSkgKyAKICBnZW9tX2xpbmUoc2l6ZSA9IDEsIGFscGhhID0gMC44KSArIAogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxKSwgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgbGFicyh4ID0gIlJlY2FsbCIsIAogICAgICAgeSA9ICJQcmVjaXNpb24iLCAKICAgICAgIGNvbG9yID0gIkNlbGxzIiwgCiAgICAgICB0aXRsZSA9ICJ0cmFkZVNlcSIpICsgCiAgdGhlbWVfYW5hbHlzaXMoKSArIAogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGxpbmV3aWR0aCA9IDIsIGFscGhhID0gMSkpKQpgYGAKCiMgU2Vzc2lvbiBJbmZvCgpgYGB7cn0Kc2Vzc2lvbmluZm86OnNlc3Npb25faW5mbygpCmBgYAo=